﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "CollaborationCacheInterface.h"
#include "IObject.h"
namespace gcmp
{
    /// \brief 构件级协同，Element的占用者信息管理
    class COLLABORATION_CACHE_INTERFACE_EXPORT IElementOccupantManager : public IObject
    {
        DEFINE_CAST_DERIVED(IElementOccupantManager, IObject)
    public:
        /// \brief 向缓存中设置Element的占用者信息
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param elementId 需要设置占用者的ElementId
        /// \param occupantId Element的占用者
        /// \return void
        virtual void Set(const ElementId & elementId, int64_t occupantId) = 0;

        /// \brief 向缓存中批量设置Elements的占用者信息
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param elementsOccupant 需要设置占用者的ElementIds及对应占用者信息
        /// \return void
        virtual void Set(const std::unordered_map<ElementId, int64_t, ElementIdHash> & elementsOccupant) = 0;

        /// \brief 根据ElementId从缓存中删除占用者信息
        ///
        /// \param elementId 需要删除占用者信息的ElementId
        /// \return void
        virtual void Delete(const ElementId & elementId) = 0;

        /// \brief 根据ElementIds从缓存中批量删除Elements的占用者信息
        ///
        /// \param elementIds 需要删除占用者信息的批量ElementId
        /// \return void
        virtual void Delete(const std::vector<ElementId> & elementIds) = 0;

        /// \brief 根据ElementId从缓存中获取占用者信息
        ///
        /// \param elementId 需要获取占用者信息的ElementId
        /// \return int64_t 获取的占用者信息,ElementId不在缓存中，返回 -1
        virtual int64_t Get(const ElementId & elementId) const = 0;

        /// \brief 根据ElementIds从缓存中批量获取占用者信息
        ///
        /// \param elementIds 需要获取占用者信息的批量ElementId
        /// \return 批量获取的ElementId及对应占用者信息
        virtual const std::unordered_map<ElementId, int64_t, ElementIdHash> Get(const std::vector<ElementId> & elementIds) const = 0;

        /// \brief 根据对应占用者获取缓存中所有的ElementIds
        ///
        /// \param occupantId 占用者信息
        /// \return 获取的ElementIds
        virtual const std::vector<ElementId> Get(int64_t occupantId) const = 0;

        /// \brief 获取缓存中所有Element的占用者信息
        ///
        /// \return 缓存中所有ElementId及对应的占用者信息
        virtual std::unordered_map<ElementId, int64_t, ElementIdHash> & GetAll() = 0;

        /// \brief 获取缓存中所有Element的占用者信息
        ///
        /// \return 缓存中所有Elementid及对应的占用者信息
        virtual const std::unordered_map<ElementId, int64_t, ElementIdHash> & GetAll() const = 0;

        /// \brief 清理缓存中所有Element的占用者信息
        ///
        /// \return void
        virtual void Clear() = 0;
    };
}